Named Query কি এবং এর প্রয়োজনীয়তা

Java Technologies - স্প্রিং ওআরএম (Spring ORM) Spring ORM এবং Named Queries |
79
79

Named Query (নেমড কুয়েরি) হল Hibernate বা JPA-তে পূর্বনির্ধারিত SQL বা HQL স্টেটমেন্ট যা একটি নির্দিষ্ট নাম দিয়ে সংজ্ঞায়িত করা হয়। এটি ডাটাবেস অপারেশনকে আরও কার্যকরী এবং পুনঃব্যবহারযোগ্য করতে ব্যবহৃত হয়। Named Query সরাসরি Entity ক্লাসে বা Mapping ফাইলে সংজ্ঞায়িত করা যেতে পারে এবং প্রয়োজনে ডাটাবেস অপারেশনের জন্য ডাকা যায়।

Named Query এর মূল গঠন

Hibernate বা JPA-তে Named Query সাধারণত এভাবে সংজ্ঞায়িত হয়:

Hibernate এ Named Query

@NamedQuery(
    name = "Employee.findByDepartment",
    query = "FROM Employee WHERE department = :department"
)

XML Mapping ফাইলে

<hibernate-mapping>
    <class name="com.example.model.Employee" table="employees">
        <query name="Employee.findByDepartment">
            <![CDATA[FROM Employee WHERE department = :department]]>
        </query>
    </class>
</hibernate-mapping>

Named Query কেন প্রয়োজন?

১. পুনঃব্যবহারযোগ্যতা

Named Query একবার সংজ্ঞায়িত হলে অ্যাপ্লিকেশনের যেকোনো জায়গা থেকে পুনরায় ব্যবহার করা যায়। এটি কোড পুনর্লিখনের প্রয়োজনীয়তা দূর করে।

২. বিচ্ছিন্নতা

ডাটাবেসের জন্য প্রয়োজনীয় কুয়েরিগুলো Entity বা Mapping ফাইলেই সংজ্ঞায়িত থাকে। এর ফলে কোড এবং কুয়েরি বিচ্ছিন্ন থাকে, যা কোডের রক্ষণাবেক্ষণ সহজ করে।

৩. দক্ষতা (Performance)

Named Query সাধারণত ডাটাবেস লেভেলে কম্পাইল করা হয় এবং পরে ক্যাশে রাখা হয়। ফলে একই কুয়েরি বারবার চললেও সেটি দ্রুত কার্যকর হয়।

৪. Error Handling সহজ করা

Named Query-এর সিনট্যাক্স শুরুতেই চেক করা হয়, যা runtime এ কুয়েরি-সম্পর্কিত ত্রুটি কমায়।

৫. বিরূপ আক্রমণ প্রতিরোধ (Security)

Named Query ব্যবহারে সরাসরি SQL Injection প্রতিরোধ করা যায়, কারণ এটি ব্যবহারকারীর সরাসরি ইনপুট থেকে Query তৈরি করে না।


Named Query এর উদাহরণ

Entity ক্লাসে Named Query সংজ্ঞায়িত করা

package com.example.model;

import jakarta.persistence.*;

@Entity
@NamedQueries({
    @NamedQuery(
        name = "Employee.findByDepartment",
        query = "FROM Employee WHERE department = :department"
    ),
    @NamedQuery(
        name = "Employee.findBySalaryGreaterThan",
        query = "FROM Employee WHERE salary > :salary"
    )
})
@Table(name = "employees")
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "name")
    private String name;

    @Column(name = "department")
    private String department;

    @Column(name = "salary")
    private Double salary;

    // Getters and Setters
}

Named Query ব্যবহার

DAO বা সার্ভিস লেয়ারে Named Query ব্যবহার করা হয়:

package com.example.dao;

import com.example.model.Employee;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public class EmployeeDao {

    @Autowired
    private SessionFactory sessionFactory;

    public List<Employee> findByDepartment(String department) {
        Session session = sessionFactory.getCurrentSession();
        return session.createNamedQuery("Employee.findByDepartment", Employee.class)
                      .setParameter("department", department)
                      .getResultList();
    }

    public List<Employee> findBySalaryGreaterThan(Double salary) {
        Session session = sessionFactory.getCurrentSession();
        return session.createNamedQuery("Employee.findBySalaryGreaterThan", Employee.class)
                      .setParameter("salary", salary)
                      .getResultList();
    }
}

Main ক্লাসে Named Query ডাকা

Named Query ব্যবহার করে ডাটাবেস অপারেশন করা:

package com.example;

import com.example.service.EmployeeService;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Main {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = 
                new AnnotationConfigApplicationContext(AppConfig.class);

        EmployeeService employeeService = context.getBean(EmployeeService.class);

        // Named Query ব্যবহার
        System.out.println("Employees in IT Department:");
        employeeService.findByDepartment("IT").forEach(emp -> 
            System.out.println(emp.getName())
        );

        System.out.println("Employees with Salary > 50000:");
        employeeService.findBySalaryGreaterThan(50000.0).forEach(emp -> 
            System.out.println(emp.getName())
        );

        context.close();
    }
}

সারসংক্ষেপ

  • Named Query ডাটাবেস অপারেশনকে পুনঃব্যবহারযোগ্য, কার্যকর এবং নিরাপদ করে।
  • এটি Entity বা Mapping ফাইলেই সংজ্ঞায়িত হয় এবং অ্যাপ্লিকেশন জুড়ে ব্যবহার করা যায়।
  • Performance উন্নত করার জন্য এটি ক্যাশে ব্যবহৃত হয়।

Named Query ডাটাবেস অপারেশনের নির্ভরযোগ্যতা বৃদ্ধি এবং কোড মডুলার করতে অত্যন্ত কার্যকর।

Content added By
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion